
# 1. 列表生成式： 快速创建列表。

# 传统方式
squares = []
for x in range(10):
    squares.append(x**2)

# Pythonic way
squares = [x**2 for x in range(10)]

#======================================================================================================
#2. with 语句： 自动管理资源（如文件、锁、数据库连接），确保它们被正确关闭。
import os
if os.path.exists('file.txt'):
    with open('file.txt', 'r') as f:
        content = f.read()
# with open('file.txt', 'r') as f:
#     content = f.read()
# 文件在此处已自动关闭

#======================================================================================================
#3. 使用 enumerate 和 zip：

# 需要索引时
my_list = ['a', 'b', 'c']
for index, value in enumerate(my_list):
    print(f"{index}: {value}")

# 同时迭代多个列表
list_a = [1, 2, 3]
list_b = [4, 5, 6]
for a, b in zip(list_a, list_b):
    print(a,'+',b,'=',a + b)

#======================================================================================================
# 4.解包： 将可迭代对象中的元素赋值给多个变量。
# 函数参数解包
def my_func(x, y, z):
    return x + y + z

args = (1, 2, 3)
result = my_func(*args)
print(result)

# 字典解包
my_dict = {'x': 1, 'y': 2, 'z': 3}
result = my_func(**my_dict)
print(result)

#======================================================================================================
# 5.使用 collections 和 itertools 模块：
from collections import defaultdict
from itertools import chain

# defaultdict： 避免键不存在时的 KeyError。
my_dict = defaultdict(int)
my_dict['key'] += 1


# Counter： 快速计数。
from collections import Counter
my_list = ['a', 'b', 'c', 'a', 'b', 'a']
result = Counter(my_list)
print(result)

# value_counts： pandas 中用于计数。
import pandas as pd
my_list = ['a', 'b', 'c', 'a', 'b', 'a']
my_series = pd.Series(my_list)
result = my_series.value_counts()
print(result)

# itertools.chain： 高效合并多个可迭代对象。
# chain： 合并多个可迭代对象。
list1 = [1, 2, 3]
list2 = [4, 5, 6]
result = list(chain(list1, list2))
print(result)


#======================================================================================================
# 类型注解
from typing import List, Dict, Tuple, Set

# List[int] 表示这是一个只包含整数的列表
numbers: List[int] = [1, 2, 3, 4, 5]

# Dict[str, int] 表示这是一个键为字符串、值为整数的字典
student_scores: Dict[str, int] = {"Alice": 95, "Bob": 88}

# Tuple[int, str, bool] 表示这是一个包含整数、字符串、布尔值的元组
person_info: Tuple[int, str, bool] = (25, "Alice", True)

# Set[str] 表示这是一个只包含字符串的集合
unique_names: Set[str] = {"Alice", "Bob", "Charlie"}
#======================================================================================================

# 可选类型（Optional）
# 当值可能是某种类型或者是 None 时使用：
from typing import Optional

def find_student(name: str) -> Optional[str]:
    """根据名字查找学生，可能找到也可能返回None"""
    students = {"Alice": "A001", "Bob": "B002"}
    return students.get(name)  # 可能返回字符串或None

# 等价于 Union[str, None]

#======================================================================================================
# 联合类型（Union）
# 当值可能是多种类型之一时使用：

from typing import Union

def process_input(data: Union[str, int, List[int]]) -> None:
    """处理可能是字符串、整数或整数列表的输入"""
    if isinstance(data, str):
        print(f"字符串: {data}")
    elif isinstance(data, int):
        print(f"整数: {data}")
    elif isinstance(data, list):
        print(f"列表: {data}")

process_input("hello")    # 输出：字符串: hello
process_input(42)         # 输出：整数: 42  
process_input([1, 2, 3])  # 输出：列表: [1, 2, 3]


#======================================================================================================

from typing import List, Dict, Optional, Union

def process_students(students: List[Dict[str, Union[str, int]]]) -> Optional[float]:
    """
    处理学生数据，计算平均分数
    
    参数:
        students: 学生列表，每个学生是包含'name'和'score'的字典
        
    返回:
        平均分数（浮点数），如果没有学生则返回None
    """
    if not students:
        return None
    
    total = 0
    for student in students:
        total += student['score']
    
    return total / len(students)

# 测试数据
students_data = [
    {"name": "Alice", "score": 95},
    {"name": "Bob", "score": 88},
    {"name": "Charlie", "score": 92}
]

average = process_students(students_data)
print(f"平均分: {average}")




